#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
cavity.py - 腔体功率监控模块

该模块实现了对单个腔体通道的功率监控功能，包括：
1. 功率值监控
2. 状态变化回调
3. 连接状态监控
4. 日志记录
"""

from epics import PV, caget
import datetime

class power(object):
    """
    腔体功率监控类
    
    该类用于监控单个腔体通道的功率值，由LLRF触发。
    主要功能包括：
    1. 功率值监控
    2. 状态变化回调
    3. 连接状态监控
    4. 日志记录
    """
    
    @property
    def value_now(self):
        """
        获取当前功率值
        
        返回：
            float: 当前功率值
        """
        return self.pv.get()

    def onPowerValueChange(self, pvname=None, value=None, conn=None, host=None, timestamp=None, **kwargs):
        """
        功率值变化回调函数
        
        参数：
            pvname (str): PV名称
            value (float): 新的功率值
            conn (bool): 连接状态
            host (str): 主机名
            timestamp (float): 时间戳
        """
        if self.init_status == True:
            self.value = value
            self.timestamp = timestamp
            self.callback_function()
            if (conn is False):
                # 生成PV连接丢失告警
                if self.logging is None:
                    print('ca connection status changed: ', pvname, conn, host)
                else:
                    self.logging.info('ca connection status changed:  %s %s %s', pvname, conn, host)
            else: pass
        else: pass

    def callback_function(self):
        """
        执行回调函数
        """
        if callable(self.callback):
            self.callback(self)
        else: pass

    def __init__(self, cavity_dict, callback=None, logging=None, *args, **kwargs):
        """
        初始化腔体功率监控对象
        
        参数：
            cavity_dict (dict): 腔体配置字典，包含：
                - cavity_name: 腔体名称
                - cavity_pickup: 腔体拾取点
                - pvname: PV名称
            callback (function, optional): 回调函数
            logging (Logger, optional): 日志记录器
        """
        self.init_status = False
        self.logging = logging
        self.cavity_name = cavity_dict['cavity_name'][1]
        self.pickup_name = cavity_dict['cavity_pickup'][1]
        self.callback = callback
        self.pvname = cavity_dict['pvname'][1]
        caget(self.pvname)
        self.pv = PV(self.pvname, callback=self.onPowerValueChange)
        self.value = self.value_now
        self.unit = 'kW'  # 功率单位：千瓦
        self.timestamp = None
        self.init_status = True

    def __del__(self):
        """
        析构函数，打印删除实例信息
        """
        print('Delete cavity.power instance -> '+self.cavity_name+' -> '+self.pvname)

def main():
    """
    主函数（空实现）
    """
    pass

if __name__ == '__main__':
    main()
